#ifndef VIDEOPLAYERWIDGET_H
#define VIDEOPLAYERWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QSlider>
#include <QLabel>
#include <QListWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QVideoWidget>
#include <QFileDialog>
#include <QPropertyAnimation>
#include <QMap>
#include "models/videoplayermodel.h"
#include "playersettingsdialog.h"
#include "transcodeprogressdialog.h"
#include "business/video/videotranscoder.h"

/**
 * @brief 视频播放器UI层
 * 
 * 负责界面显示和用户交互，采用MVC架构中的View层
 * 屏幕分辨率：1024x600
 */
class VideoPlayerWidget : public QWidget
{
    Q_OBJECT

public:
    explicit VideoPlayerWidget(QWidget *parent = nullptr);
    ~VideoPlayerWidget();
    
    /**
     * @brief 清理资源（返回主页时调用）
     * 停止播放并释放资源，避免后台继续占用内存
     */
    void cleanup();

private:
    // ========== UI组件 ==========
    
    // 标题栏
    QWidget *m_titleBarWidget;          // 标题栏容器
    QLabel *m_titleLabel;                // 标题标签
    QPushButton *m_togglePlaylistButton; // 显示/隐藏播放列表按钮
    
    // 主内容区
    QWidget *m_mainContentWidget;        // 主内容容器
    QWidget *m_videoAreaWidget;          // 视频区域容器
    QVideoWidget *m_videoWidget;         // 视频显示控件
    
    // 播放列表面板
    QWidget *m_playlistPanel;            // 播放列表面板
    QLabel *m_playlistTitleLabel;        // 播放列表标题
    QPushButton *m_closePlaylistButton;  // 关闭播放列表按钮
    QPushButton *m_addFilesButton;       // 添加文件按钮
    QPushButton *m_clearPlaylistButton;  // 清空列表按钮
    QListWidget *m_playlistWidget;       // 播放列表控件
    
    // 控制栏
    QWidget *m_controlBarWidget;         // 控制栏容器
    QSlider *m_progressSlider;           // 进度条
    QPushButton *m_previousButton;       // 上一个按钮
    QPushButton *m_playPauseButton;      // 播放/暂停按钮
    QPushButton *m_nextButton;           // 下一个按钮
    QLabel *m_timeLabel;                 // 时间标签
    QPushButton *m_volumeButton;         // 音量按钮
    QPushButton *m_settingsButton;       // 设置按钮
    
    // 音量控制（弹出式）
    QWidget *m_volumePanel;              // 音量面板
    QSlider *m_volumeSlider;             // 音量滑块
    
    // Model层
    VideoPlayerModel *m_playerModel;     // 播放器模型
    
    // 转码相关
    VideoTranscoder *m_transcoder;              // 视频转码器
    TranscodeProgressDialog *m_transcodeDialog; // 转码进度对话框
    QMap<QString, QString> m_videoPathMap;      // 原始路径→转码路径映射
    
    // 状态变量
    bool m_playlistVisible;              // 播放列表是否可见
    bool m_userSeekingSlider;            // 用户是否正在拖动进度条
    
    // 动画
    QPropertyAnimation *m_playlistAnimation; // 播放列表展开/收起动画

    // ========== 私有方法 ==========
    
    /**
     * @brief 初始化UI界面
     */
    void setupUI();
    
    /**
     * @brief 初始化信号连接
     */
    void setupConnections();
    
    /**
     * @brief 创建标题栏
     */
    void createTitleBar();
    
    /**
     * @brief 创建视频显示区
     */
    void createVideoArea();
    
    /**
     * @brief 创建播放列表面板
     */
    void createPlaylistPanel();
    
    /**
     * @brief 创建控制栏
     */
    void createControlBar();
    
    /**
     * @brief 创建音量面板
     */
    void createVolumePanel();
    
    /**
     * @brief 格式化时间显示
     * @param milliseconds 毫秒数
     * @return 格式化的时间字符串 (mm:ss)
     */
    QString formatTime(qint64 milliseconds);
    
    /**
     * @brief 更新播放列表显示
     */
    void updatePlaylistDisplay();
    
    /**
     * @brief 显示播放列表面板
     */
    void showPlaylistPanel();
    
    /**
     * @brief 隐藏播放列表面板
     */
    void hidePlaylistPanel();
    
    /**
     * @brief 处理视频添加（包含转码检测）
     * @param filePath 视频文件路径
     * @return 是否成功添加
     */
    bool processAndAddVideo(const QString &filePath);
    
    /**
     * @brief 启动时检查缓存
     */
    void checkCacheOnStartup();

private slots:
    // ========== UI事件槽函数 ==========
    
    /**
     * @brief 播放/暂停按钮点击
     */
    void onPlayPauseClicked();
    
    /**
     * @brief 上一个按钮点击
     */
    void onPreviousClicked();
    
    /**
     * @brief 下一个按钮点击
     */
    void onNextClicked();
    
    /**
     * @brief 进度条拖动
     * @param position 进度位置
     */
    void onProgressSliderMoved(int position);
    
    /**
     * @brief 进度条按下
     */
    void onProgressSliderPressed();
    
    /**
     * @brief 进度条释放
     */
    void onProgressSliderReleased();
    
    /**
     * @brief 音量按钮点击
     */
    void onVolumeButtonClicked();
    
    /**
     * @brief 音量滑块变化
     * @param value 音量值
     */
    void onVolumeSliderChanged(int value);
    
    /**
     * @brief 设置按钮点击
     */
    void onSettingsClicked();
    
    /**
     * @brief 显示/隐藏播放列表按钮点击
     */
    void onTogglePlaylistClicked();
    
    /**
     * @brief 关闭播放列表按钮点击
     */
    void onClosePlaylistClicked();
    
    /**
     * @brief 添加文件按钮点击
     */
    void onAddFilesClicked();
    
    /**
     * @brief 清空播放列表按钮点击
     */
    void onClearPlaylistClicked();
    
    /**
     * @brief 播放列表项双击
     * @param item 双击的列表项
     */
    void onPlaylistItemDoubleClicked(QListWidgetItem *item);
    
    // ========== Model信号响应槽函数 ==========
    
    /**
     * @brief 播放状态变化响应
     * @param state 新的播放状态
     */
    void onPlayStateChanged(VideoPlayerModel::PlayState state);
    
    /**
     * @brief 播放进度更新响应
     * @param position 当前播放位置
     */
    void onPositionChanged(qint64 position);
    
    /**
     * @brief 视频时长变化响应
     * @param duration 视频总时长
     */
    void onDurationChanged(qint64 duration);
    
    /**
     * @brief 当前视频变化响应
     * @param index 新的视频索引
     */
    void onCurrentMediaChanged(int index);
    
    /**
     * @brief 播放列表变化响应
     */
    void onPlaylistChanged();
    
    /**
     * @brief 错误处理响应
     * @param errorString 错误信息
     */
    void onErrorOccurred(const QString &errorString);
};

#endif // VIDEOPLAYERWIDGET_H

